package com.yf.utils;

import java.util.HashSet;
import java.util.Set;
import java.util.function.BiConsumer;
import java.util.function.Function;

/**
 * 通用中间表绑定工具
 */
public class BindingUtil {

    /**
     * 通用绑定方法
     *
     * @param <K>            主实体ID类型（如会话ID）
     * @param <V>            关联实体ID类型（如工具ID）
     * @param ownerId        主实体ID
     * @param bindingIds     要绑定的关联实体ID集合
     * @param existingGetter 获取现有绑定关系的方法
     * @param binder         绑定操作方法 ( 含需要绑定的 Id )
     * @param unBinder       解绑操作方法 ( 含需要解绑的 Id )
     * @return 绑定是否成功
     */
    public static <K, V> boolean bindEntities(
            K ownerId,
            Set<V> bindingIds,
            Function<K, Set<V>> existingGetter,
            BiConsumer<K, Set<V>> binder,
            BiConsumer<K, Set<V>> unBinder) {

        // 1. 获取现有绑定
        Set<V> existingIds = existingGetter.apply(ownerId);

        // 2. 计算需要解绑和绑定的ID
        Set<V> toUnbind = new HashSet<>(existingIds);
        toUnbind.removeAll(bindingIds);

        Set<V> toBind = new HashSet<>(bindingIds);
        toBind.removeAll(existingIds);

        // 3. 执行解绑操作
        if (!toUnbind.isEmpty()) {
            unBinder.accept(ownerId, toUnbind);
        }

        // 4. 执行绑定操作
        if (!toBind.isEmpty()) {
            binder.accept(ownerId, toBind);
        }

        return true;
    }
}